package com.geovis.emergency.spd.biz.system.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.geovis.common.log.dto.LogDTO;
import com.geovis.common.log.exports.ILogService;
import com.geovis.common.mybatis.page.PageParam;
import com.geovis.common.mybatis.page.PageResult;
import com.geovis.emergency.spd.biz.system.mapper.SystemLogMapper;
import com.geovis.emergency.spd.biz.system.service.ISystemLogService;
import com.geovis.emergency.spd.entity.system.entity.SystemLog;
import com.geovis.emergency.spd.entity.system.pojo.dto.SystemLogQueryDTO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 日志表 服务实现类
 * </p>
 *
 * @author Lonsho
 * @since 2022-08-02
*/

@Service
@RequiredArgsConstructor
@Slf4j
public class SystemLogServiceImpl extends ServiceImpl<SystemLogMapper, SystemLog> implements ISystemLogService, ILogService {
    @Override
    public PageResult<SystemLog> listPage(PageParam<SystemLogQueryDTO> pageParam) {
        SystemLogQueryDTO queryDTO = pageParam.getQuery();
        IPage<SystemLog> page = pageParam.buildPage();
        LambdaQueryWrapper<SystemLog> wrapper = Wrappers.lambdaQuery(SystemLog.class);
        if (ObjectUtil.isNotNull(queryDTO)){
            wrapper.eq(StrUtil.isNotBlank(queryDTO.getRequestType()),SystemLog::getRequestType,queryDTO.getRequestType());
            wrapper.like(StrUtil.isNotBlank(queryDTO.getRequestUri()),SystemLog::getRequestUri,queryDTO.getRequestUri());
            wrapper.like(StrUtil.isNotBlank(queryDTO.getRequestIp()),SystemLog::getRequestIp,queryDTO.getRequestIp());
            wrapper.eq(StrUtil.isNotBlank(queryDTO.getMethodName()),SystemLog::getMethodName,queryDTO.getMethodName());
            wrapper.like(StrUtil.isNotBlank(queryDTO.getLogDescription()),SystemLog::getLogDescription,queryDTO.getLogDescription());
            wrapper.eq(StrUtil.isNotBlank(queryDTO.getLogLevel()),SystemLog::getLogLevel,queryDTO.getLogLevel());
            wrapper.eq(StrUtil.isNotBlank(queryDTO.getVerifyStatus()),SystemLog::getVerifyStatus,queryDTO.getVerifyStatus());
            wrapper.and(ObjectUtil.isAllNotEmpty(queryDTO.getBeginRequestTime(),queryDTO.getEndRequestTime()),
                    ew -> ew.between(SystemLog::getBeginRequestTime,queryDTO.getBeginRequestTime(),queryDTO.getEndRequestTime())
                            .or().between(SystemLog::getEndRequestTime,queryDTO.getBeginRequestTime(),queryDTO.getEndRequestTime())
            );
            wrapper.orderByDesc(SystemLog::getCreateTime);
        }
        page(page, wrapper);
        return new PageResult<SystemLog>(page);
    }
    @Override
    public void save(LogDTO logDTO) {
        SystemLog systemLog = BeanUtil.toBean(logDTO, SystemLog.class);
        save(systemLog);
    }
}
